Skip to content

chore: inline needlessly extracted single-use helpers - #14048

Merged
ndeloof merged 2 commits into
mainfrom
cleanup-needless-extractions
Aug 14, 2026
Merged

chore: inline needlessly extracted single-use helpers#14048
ndeloof merged 2 commits into
mainfrom
cleanup-needless-extractions

Conversation

@ndeloof

@ndeloof ndeloof commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Systematic "extract method" helps nobody when the extracted function has a single caller, no test, and no responsibility of its own: the reader jumps around instead of reading the flow top-down. This PR inlines the small helpers where the extraction had no real boundary — actual reuse, testability or a responsibility seam — and keeps everything that has one.

Inlined (single caller, no dedicated test, body was a plain slice of its caller's flow): one-line trampolines that other call sites already bypass (getExecTarget, attachContainer, logContainer, removeImage); helpers whose name hid a mutation or promised something else (prepareLabels mutated the map it received, checkSelectedServices filtered rather than checked, hasMore read like a predicate but restarted a spinner); and chunks whose name added nothing over the code itself (displayDryRunBuildEvent — longer than its caller, escapeDollarSign, buildVolume/Tmpfs/ImageOptions, viewFromStackList, extractEnvCLIDefined → canonical types.NewMappingWithEquals().ToMapping(), isPullPolicyValid → package-level list + slices.Contains).

Renamed/shared instead of inlined: validateNavigationMenuresolveNavigationMenu (it resolves and mutates, validates nothing); setServiceScale moved to scale.go and now used by runScale, which duplicated its four lines inline.

Deliberately untouched: the xxxCommand/runXxx cobra idiom (uniform across the package), symmetric families (toBake*, ensure*Down, …), callbacks/iterators, conversions with a real seam, everything protected by the gocyclo 16 threshold (prepareRun sits exactly at 16), and printEvent's color switch — it differs from colorFn on api.Working (SuccessColor vs nocolor), so unifying them would change the display.

No behavior change; golangci-lint (incl. gocyclo) and unit tests pass.

@ndeloof
ndeloof requested review from a team as code owners August 14, 2026 16:34
@ndeloof
ndeloof requested a review from glours August 14, 2026 16:34
thaJeztah
thaJeztah previously approved these changes Aug 14, 2026

@thaJeztah thaJeztah left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

left some suggestions

Comment thread cmd/compose/list.go Outdated
Comment thread cmd/compose/scale.go
Comment on lines +104 to +112
func setServiceScale(project *types.Project, name string, replicas int) error {
service, err := project.GetService(name)
if err != nil {
return err
}
service.SetScale(replicas)
project.Services[name] = service
return nil
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like this is used in two places, but possibly even worth considering inlining it in both places;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would rather keep this one: it has two real callers (applyScaleOpts in create.go and runScale), and the value-semantics dance (GetServiceSetScale → write back into project.Services[name]) is easy to get wrong — forgetting the write-back is a silent no-op. Before this PR runScale had exactly that duplication, drifting from the helper. Real reuse is the boundary this PR tries to preserve; happy to inline both if you feel strongly about it.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, right yeah, the project.Services[name] = service may be easily overlooked. Yup, that's fair, no problem!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I was actually looking; couldn't we just iterate over project.Services, but there was also "disabled services" etc to take into account).

Comment thread pkg/compose/down.go Outdated
Inline small functions that were extracted from their single call site
without a real boundary to justify it — no reuse, no dedicated test, no
responsibility of their own — so each caller now tells its whole story
top-down:

- getExecTarget, attachContainer, logContainer: one-line trampolines to
  getSpecifiedContainer / doAttachContainer / doLogContainer, which
  other call sites already use directly
- removeImage: single-statement wrapper, unlike its removeVolume
  sibling which has actual logic
- checkSelectedServices: named like a validation, actually a filter;
  the subtle rule (an unknown service is only an error with an explicit
  compose file) now reads where options.Services is rewritten
- prepareLabels: mutated the map it received while looking pure at the
  call site; the label writes are now visible in getCreateConfigs
- setDefaultTarget: mutation-by-pointer of the loop copy, now visible
  in the loop of injectFileReferences
- buildVolumeOptions/buildTmpfsOptions/buildImageOptions: nil-guard +
  field copies; the buildMountOptions switch now shows side by side
  what each mount type propagates (buildBindOption keeps real logic and
  keeps buildMountOptions under the gocyclo limit)
- displayDryRunBuildEvent: was longer than its only caller
- hasMore: read like a predicate, was a one-line spinner restart
- escapeDollarSign: wrapped a single bytes.ReplaceAll
- extractEnvCLIDefined: replaced by the canonical compose-go helper
  types.NewMappingWithEquals().ToMapping(), as run.go already does
- isPullPolicyValid: rebuilt the valid-values slice on every call; now
  a package-level list checked at the call site
- viewFromStackList: projection now sits next to the render closure
  that consumes exactly its three fields

No behavior change; single gocyclo threshold untouched.

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
validateNavigationMenu validated nothing: it resolves the TTY /
COMPOSE_MENU / --menu precedence and mutates opts.navigationMenu —
rename to resolveNavigationMenu.

runScale duplicated setServiceScale's GetService/SetScale/write-back
dance inline; move the helper next to its natural home in scale.go and
use it from both callers.

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>

@thaJeztah thaJeztah left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ndeloof
ndeloof merged commit ddc4b04 into main Aug 14, 2026
94 of 96 checks passed
@ndeloof
ndeloof deleted the cleanup-needless-extractions branch August 14, 2026 20:49
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Aug 19, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [docker/compose](https://github.com/docker/compose) | minor | `v5.4.0` → `v5.5.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>docker/compose (docker/compose)</summary>

### [`v5.5.0`](https://github.com/docker/compose/releases/tag/v5.5.0)

[Compare Source](docker/compose@v5.4.0...v5.5.0)

#### What's Changed

> ℹ️  This release overhauls image digest reconciliation to prevent unnecessary container recreation.\
> Existing containers may be recreated the first time you run `compose up` after upgrading, as image digests are re-evaluated using the new logic.
>
> `compose pull` now honors `pull_policy` refresh windows (`daily`, `weekly`, `every_N`).

##### ✨ Improvements

- New image digest reconciliation process by [@&#8203;glours](https://github.com/glours) & [@&#8203;ndeloof](https://github.com/ndeloof) [#&#8203;14011](docker/compose#14011) [#&#8203;14041](docker/compose#14041)

##### 🐛 Fixes

- Fix(bridge): skip pulling default image references for build-only ser… by [@&#8203;ericwyles](https://github.com/ericwyles) in [#&#8203;14010](docker/compose#14010)
- Fix(watch): stop pruning every dangling image of the project by [@&#8203;glours](https://github.com/glours) in [#&#8203;14012](docker/compose#14012)
- Fix(config): resolve service environment when computing --hash by [@&#8203;glours](https://github.com/glours) in [#&#8203;14002](docker/compose#14002)
- Fix(watch): skip unreadable directories instead of failing the watch by [@&#8203;Endika](https://github.com/Endika) in [#&#8203;13992](docker/compose#13992)
- Fix: ignore one-off container events in up monitor by [@&#8203;brano-osif](https://github.com/brano-osif) in [#&#8203;14038](docker/compose#14038)
- Fix(bridge): validate arguments of bridge subcommands by [@&#8203;glours](https://github.com/glours) in [#&#8203;14003](docker/compose#14003)
- Fix(images): tolerate containers whose image record is gone by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;14028](docker/compose#14028)

##### 🔧  Internal

- Test: Set stop\_signal to SIGTERM in nginx-based services by [@&#8203;ricardobranco777](https://github.com/ricardobranco777) in [#&#8203;13881](docker/compose#13881)
- Chore: inline needlessly extracted single-use helpers by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;14048](docker/compose#14048)
- Add ENGINE column driven by label by [@&#8203;nicksieger](https://github.com/nicksieger) in [#&#8203;13959](docker/compose#13959)

##### ⚙️ Dependencies

- Build(deps): bump github.com/moby/moby/client from 0.5.0 to 0.5.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13999](docker/compose#13999)
- Build(deps): bump github/codeql-action/upload-sarif from 4.37.3 to 4.37.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14009](docker/compose#14009)
- Build(deps): bump github/codeql-action/upload-sarif from 4.37.4 to 4.37.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14019](docker/compose#14019)
- Build(deps): bump github.com/moby/buildkit from 0.32.1 to 0.32.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14033](docker/compose#14033)
- Build(deps): bump github.com/docker/buildx from 0.36.0 to 0.36.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14034](docker/compose#14034)
- Build(deps): bump docker/github-builder/.github/workflows/bake.yml from 1.15.0 to 1.16.0 in the docker-actions group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14035](docker/compose#14035)
- Build(deps): bump github.com/moby/go-archive from 0.3.2 to 0.3.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14043](docker/compose#14043)
- Build(deps): bump github/codeql-action/upload-sarif from 4.37.5 to 4.37.6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14022](docker/compose#14022)
- Build(deps): bump github.com/docker/cli from 29.6.2+incompatible to 29.7.2+incompatible by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14042](docker/compose#14042)
- Build(deps): bump google.golang.org/grpc from 1.82.1 to 1.83.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;14008](docker/compose#14008)
- Bump golang to version 1.26.6 by [@&#8203;glours](https://github.com/glours) in [#&#8203;14045](docker/compose#14045)

#### New Contributors

- [@&#8203;ericwyles](https://github.com/ericwyles) made their first contribution in [#&#8203;14010](docker/compose#14010)
- [@&#8203;Endika](https://github.com/Endika) made their first contribution in [#&#8203;13992](docker/compose#13992)
- [@&#8203;brano-osif](https://github.com/brano-osif) made their first contribution in [#&#8203;14038](docker/compose#14038)

**Full Changelog**: <docker/compose@v5.4.0...v5.5.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODguMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants